import * as XLSX from "xlsx"

export interface ExcelHeader {
  name: string // 表头名称
  key: string // 数据字段
}

export interface ExportExcelOptions {
  data: any[] // 数据源
  fileName?: string // 文件名（默认：导出数据.xlsx）
  title?: string // 表格标题
  headers?: ExcelHeader[] // 自定义表头（默认使用数据第一个元素的字段）
  columnWidths?: number[] // 列宽（单位：字符）
}

export function exportExcel(options: ExportExcelOptions) {
  const {
    data,
    fileName = "导出数据.xlsx",
    title = "",
    headers,
    columnWidths
  } = options

  if (!data || data.length === 0) {
    console.warn("导出数据不能为空")
    return
  }

  // 处理表头
  const finalHeaders = headers || getDefaultHeaders(data)
  const headerNames = finalHeaders.map(h => h.name)
  const headerKeys = finalHeaders.map(h => h.key)

  // 处理数据
  const bodyData = data.map((item) => {
    return headerKeys.map((key) => {
      // 处理空值
      if (item[key] === null || item[key] === undefined) return ""
      // 处理日期类型
      if (item[key] instanceof Date) {
        return item[key].toLocaleString()
      }
      return item[key]
    })
  })

  // 创建工作簿
  const wb = XLSX.utils.book_new()
  const ws = XLSX.utils.aoa_to_sheet([
    [], // 留出标题行
    headerNames,
    ...bodyData
  ])

  // 添加标题
  if (title) {
    XLSX.utils.sheet_add_aoa(ws, [[title]], { origin: "A1" })
    // 合并标题行
    if (!ws["!merges"]) ws["!merges"] = []
    ws["!merges"].push(XLSX.utils.decode_range(`A1:${XLSX.utils.encode_col(headerNames.length - 1)}1`))
  }

  // 设置列宽
  if (columnWidths) {
    ws["!cols"] = columnWidths.map(w => ({ wch: w }))
  } else {
    // 自动列宽（简单实现）
    ws["!cols"] = headerNames.map(() => ({ wch: 20 }))
  }

  XLSX.utils.book_append_sheet(wb, ws, "Sheet1")

  // 写入文件
  XLSX.writeFile(wb, fileName)
}

// 生成默认表头（使用数据第一个元素的key）
function getDefaultHeaders(data: any[]): ExcelHeader[] {
  const firstItem = data
  return Object.keys(firstItem).map(key => ({
    name: key,
    key
  }))
}
